// 定义关于频道的API调用函数
import request from '@/utils/request'
import store from '@/store'

const KEY = 'geek-client-mobile-channels'

/**
 * 获取全部频道
 * @returns promise
 */
export const getAllChannels = () => {
  return request({ url: '/v1_0/channels' })
}

/**
 * 获取我的频道
 * @returns promise
 */
export const getMyChannels = async () => {
  // async 加上的目的：返回值的时候回自动包装成一个promise对象，而且返回的值就是then中的数据
  // 1. 获取token数据，判断登录状态
  // 2. 如果未登录，获取本地频道
  // 2.1 获取到了  直接返回数据
  // 2.2 没有获取  调用接口，得到数据，存储数据，返回数据
  // 3. 如果已登录，调用接口，得到数据，返回数据
  // return request({ url: '/v1_0/user/channels' })
  if (!store.state.user.token) {
    // 未登录
    // 获取本地数据，需要处理成 Array 类型
    const localData = JSON.parse(localStorage.getItem(KEY) || '[]')
    if (localData.length) {
      // 存了数据
      return localData
    } else {
      // 没存数据
      const [, res] = await request({ url: '/v1_0/user/channels' })
      // 存储数据
      localStorage.setItem(KEY, JSON.stringify(res.data.data.channels))
      return res.data.data.channels
    }
  } else {
    // 已登录
    const [, res] = await request({ url: '/v1_0/user/channels' })
    return res.data.data.channels
  }
}

/**
 * 添加频道
 * @param {Array<object>} newChannels - 排序好的重置式的频道数组
 */
export const addChannel = async (newChannels) => {
  if (!store.state.user.token) {
    // 未登录
    // 1. 获取频道
    const localData = JSON.parse(localStorage.getItem(KEY) || '[]')
    // 2. 添加频道
    const { id, name } = newChannels[newChannels.length - 1]
    localData.push({ id, name })
    // 3. 存储频道
    localStorage.setItem(KEY, JSON.stringify(localData))
  } else {
    // 已登录
    await request({
      url: '/v1_0/user/channels',
      method: 'put',
      data: { channels: newChannels }
    })
  }
}

/**
 * 删除频道
 * @param {Number} channelId - 频道ID
 */
export const delChannel = async (channelId) => {
  if (!store.state.user.token) {
    // 未登录
    // 1. 获取频道
    const localData = JSON.parse(localStorage.getItem(KEY) || '[]')
    // 2. 获取频道对应的索引
    const index = localData.findIndex(item => item.id === channelId)
    // 3. 删除数据
    localData.splice(index, 1)
    // 4. 更新本地
    localStorage.setItem(KEY, JSON.stringify(localData))
  } else {
    // 已登录
    await request({
      url: '/v1_0/user/channels/' + channelId,
      method: 'delete'
    })
  }
}
